generate_ions.js ➔ addResource   C
last analyzed

Complexity

Conditions 7
Paths 16

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 16
dl 0
loc 22
rs 6.9811
c 0
b 0
f 0
nop 3
1
/* eslint-env node */
2
/*jslint node: true */
3
'use strict';
4
5
let jsonfile = require('jsonfile');
6
7
let resources = jsonfile.readFileSync('build/data/resources.json');
8
let elements = jsonfile.readFileSync('build/data/elements.json');
9
10
// Generates an ion resource
11
function generateResource(element, charge){
12
  let name = generateName(element, charge);
13
  addResource(name, charge, element);
14
}
15
16
// Adds an ion resource to the resources and elements list
17
function addResource(name, charge, element){
18
  if(!resources[name]){
19
    resources[name] = {};
20
    resources[name].elements = {};
21
    resources[name].elements[element] = 1;
22
    let isotopeEnergy = resources[elements[element].main].energy;
23
    resources[name].energy = isotopeEnergy - resources['e-'].energy * charge;
24
    resources[name].html = element + htmlPostfix(charge);
25
    resources[name].charge = charge;
26
    resources[name].type = ['ion'];
27
  }
28
29
  if(elements[element].includes.indexOf(name) === -1){
30
    elements[element].includes.push(name);
31
  }
32
  if(charge < 0 && elements[element].anions.indexOf(name) === -1){
33
    elements[element].anions.push(name);
34
  }
35
  if(charge > 0 && elements[element].cations.indexOf(name) === -1){
36
    elements[element].cations.push(name);
37
  }
38
}
39
40
// Generates the name of a ion, e.g. O3+
41
function generateName(element, i) {
42
  if (i === 0) {
43
    return element;
44
  }
45
  let postfix = '';
46
  if(Math.abs(i) > 1){
47
    postfix = Math.abs(i);
48
  }
49
  postfix += getSign(i);
50
  return element + postfix;
51
}
52
53
function getSign(number){
54
  return number > 0 ? '+': '-';
55
}
56
57
// Generates the HTML postfix of an ion (+ or -)
58
function htmlPostfix(index) {
59
  let postfix = '';
60
  if(index === 0){
61
    return postfix;
62
  }
63
  postfix = Math.abs(index).toString();
64
  postfix = postfix === '1' ? '' : postfix;
65
  return '<sup>' + postfix + getSign(index) + '</sup>';
66
}
67
68
let minElectronegativity = Number.MAX_VALUE;
69
let maxElectronegativity = -Number.MAX_VALUE;
70
let redox = {};
71
for (let element in elements) {
72
  elements[element].includes = elements[element].includes || [];
73
  elements[element].anions = elements[element].anions || [];
74
  elements[element].cations = elements[element].cations || [];
75
76
  if(elements[element].electronegativity > 0 && elements[element].electronegativity < minElectronegativity){
77
    minElectronegativity = elements[element].electronegativity;
78
  }
79
  if(elements[element].electronegativity > maxElectronegativity){
80
    maxElectronegativity = elements[element].electronegativity;
81
  }
82
83
  let energies = {};
84
  let charge = -1;
85
  for (let energy of elements[element].electron_affinity || []) {
86
    generateResource(element, charge);
87
    energies[charge] = -energy;
88
    charge--;
89
  }
90
91
  energies[0] = 0;
92
93
  charge = 1;
94
  for (let energy of elements[element].ionization_energy || []) {
95
    generateResource(element, charge);
96
    energies[charge] = energy;
97
    charge++;
98
  }
99
100
  let cummulative = {};
101
  for(let charge in energies){
102
    cummulative[charge] =  cumulativeEnergy(energies, charge);
103
  }
104
  if(typeof redox[element] === 'undefined'){
105
    redox[element] = cummulative;
106
  }
107
}
108
109
/* Calculates the cummulative energy of a redox level.
110
The logic is the following: the redox array gives how much energy it costs
111
to go from a level to the next, e.g. from +2 to +3. This function calculates
112
how much it takes to go from level 0 to x by summing each successive level */
113
function cumulativeEnergy(redox, level) {
114
  let energy = 0;
115
  let start = Math.min(0, level);
116
  let end = Math.max(0, level);
117
  for (let i = start; i <= end; i++) {
118
    energy += redox[i];
119
  }
120
  if (level < 0) {
121
    energy = -energy;
122
  }
123
  return energy;
124
}
125
126
for (let element in elements) {
127
  let power = elements[element].electronegativity-minElectronegativity;
128
  elements[element].negative_factor = Math.pow(10, power);
129
  power = maxElectronegativity-elements[element].electronegativity;
130
  elements[element].positive_factor = Math.pow(10, power);
131
}
132
133
jsonfile.writeFileSync('build/data/resources.json', resources, {
134
  spaces: 2
135
});
136
jsonfile.writeFileSync('build/data/elements.json', elements, {
137
  spaces: 2
138
});
139
jsonfile.writeFileSync('build/data/redox.json', redox, {
140
  spaces: 2
141
});
142